package com.edu.mapper;

import com.edu.bean.User;
import org.apache.ibatis.annotations.Param;

import java.util.List;
import java.util.Map;

/**
 * @Author:mx
 * @Date :2022/9/27 - 09 - 27 - 19:39
 */
public interface UserMapper {

   /*
   *   1.单个简单类型(8个基本型（包装类） 字符串)的参数
   *     a。无别名的时候 随便写 #{}
   *        User selectUser(@Param("userId")int userId);
   *      b.#{别名}
   *
   * */
   User selectUser(int userId);
   /*
   * 通过用户名 查找用户
   * */
   User selectUserByUsername(@Param("un") String username);

   /*
   * 利用 ${} 去实现查询动态列
   * */
   String selectUserProperty(String property);

   /*
   * 通过用户名和密码来查询
   * 2 参数为多个简单类型的
   *       多个参数实际是封装在一个map集合里 传递给xml文件
   *        {
   *            arg0: "zhangsan",
   *            arg1: "123456",
   *            param1:"zhangsan",
   *            param2:"123456"
   *        }
   *      不使用别名的时候:
   *        User selectUserByUsernameAndPassword(String username,String password);
   *       方式一:  SELECT * FROM user WHERE username = #{arg0} AND password = #{arg1}
   *       方式二:  SELECT * FROM user WHERE username = #{param1} AND password = #{param2}
   *
   *      使用别名:
   *        User selectUserBy..(@Param("name")String username,@Param("pwd")String password);
   *        SELECT * FROM user WHERE username = #{name} AND password = #{pwd}
   *
   * */
   User selectUserByUsernameAndPassword(@Param("username") String username, @Param("password") String password);

   /*
   *     3.当参数是一个对象时
   *       不使用别名:int insertUser(User u);
   *       方式一:在sql中 直接使用 对象的属性 #{属性名}
   *       INSERT INTO user(username,password,user_money) VALUES(#{username},#{password},#{userMoney})
   *
   *       使用了别名: int insertUser(@Param("u") User u);
   *       方式二: #{别名.属性名}
   *       INSERT INTO user(username,password,user_money) VALUES(#{u.username},#{u.password},#{u.userMoney})
    * */
   int insertUser(@Param("u") User u);

   /*
   * 4 当参数是 多个且包含 对象的时候
   *    不使用别名:User selectUser3(User u,int num);
   *     方式一:
   *     SELECT * FROM user WHERE username = #{arg0.username} and password = #{arg0.password} and 1 = #{arg1}
   *     方式二：
   *     SELECT * FROM user WHERE username = #{param1.username} and password = #{param1.password} and 1 = #{param2}
   *     使用别名:User selectUser3(@Param("user")User u,@Param("num") int num);
   *     SELECT * FROM user WHERE username = #{user.username} and password = #{user.password} and 1 = #{num}
   *
   * */
   User selectUser3(@Param("user") User u, @Param("num") int num);

   /*
    *     参数是一个数组时：
    *     int deleteUsers(int[] userIds);
         不使用别名时
           mybatis 会把 数组的内容放在一个map里 其中 map的键 array / arg0
          方式一: array[0]  array[1]
          DELETE FROM user WHERE userId = #{array[0]} or userId = #{array[1]}

          使用别名:
          int deleteUsers(@Param("userIds")int[] ids);
          方式二: 别名[下标]
          DELETE FROM user WHERE userId = #{userIds[0]} or userId = #{userIds[1]}
   * */
   int deleteUsers(@Param("userIds") int[] ids);


   /*
   *  当参数是一个集合时
   * */
   int deleteUsers2(@Param("userIds") List<Integer> ids);

   /*
   *  参时是一个map
   * */
   User selectUser4(@Param("map") Map<String, Object> map);
}
